package by.dvrudenko.avtobaza.webapp.page.createRoute;


import java.util.List;

import javax.inject.Inject;

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import by.dvrudenko.avtobaza.datamodel.Car;
import by.dvrudenko.avtobaza.datamodel.Driver;
import by.dvrudenko.avtobaza.datamodel.Route;
import by.dvrudenko.avtobaza.datamodel.UserOrder;
import by.dvrudenko.avtobaza.datamodel.enums.OrderStatus;
import by.dvrudenko.avtobaza.services.CarService;
import by.dvrudenko.avtobaza.services.DriverService;
import by.dvrudenko.avtobaza.services.RouteService;
import by.dvrudenko.avtobaza.services.UserOrderService;
import by.dvrudenko.avtobaza.webapp.page.BaseLayout;
import by.dvrudenko.avtobaza.webapp.page.home.HomePage;
import by.dvrudenko.avtobaza.webapp.utils.renderer.CarChoiseRenderer;
import by.dvrudenko.avtobaza.webapp.utils.renderer.DriverChoiseRenderer;

public class CreateRoutePage extends BaseLayout {
	
	@Inject
	private DriverService driverService;
	
	@Inject
	private CarService carService;
	
	@Inject
	private RouteService routeService;
	
	@Inject
	private UserOrderService userOrderService;	
	
	private static final Logger LOGGER = LoggerFactory.getLogger(CreateRoutePage.class);
	
	final private List<Driver> allFreeDriver = driverService.getAllDriverWork(false);
		
	final private List<UserOrder> allFreeUserOrder = userOrderService.getAllOrderByStatus(OrderStatus.processed);	
	
	public CreateRoutePage(final Route route, final UserOrder userOrder) {
		
		//форма заказа
		Form<Route> formCreateRoute = new Form<Route>("form", new CompoundPropertyModel<Route>(route));
		
		formCreateRoute.add(new Label ("cargoBeginningCity" , userOrder.getCargoBeginningCity().getCityName()));
		formCreateRoute.add(new Label ("cargoFinalCity" , userOrder.getCargoFinalCity().getCityName()));				
		formCreateRoute.add(new Label("cargoWeight", userOrder.getCargoWeight()));
		formCreateRoute.add(new Label("cargoVolume", userOrder.getCargoVolume()));
		formCreateRoute.add(new Label("cargoDescription", userOrder.getCargoDescription()));
		
		// форма выбора водителя
		Model<Driver>driverModel= new Model<Driver>();
		final Form formDriver = new Form("formDriver", new CompoundPropertyModel<Driver>(driverModel));
		formDriver.setOutputMarkupId(true);
		
		// комбик с водителями
		final DropDownChoice<Driver> driverChoice = new DropDownChoice<Driver>("driverChoice",driverModel, allFreeDriver, DriverChoiseRenderer.INSTANCE){
			
			@Override
			protected boolean wantOnSelectionChangedNotifications() {
				return true;
			}
						
		};
		driverChoice.setLabel(new ResourceModel("p.home.driver.panel.driverPanelTitle"));
		/* при редактировании маршрута, ставит по умолчанию уже переданного водителя,
		* и снимает флаг со схначения Driver().Work , т.к. при выборе другого водителя
		* этот водитель остался бы со значением work=true */
		if (route.getDriver()!=null){
			driverChoice.setDefaultModelObject(route.getDriver());
			route.getDriver().setWork(false);
			driverService.saveOrUpdate(route.getDriver());
		}
		driverChoice.setRequired(true);

		formDriver.add(driverChoice);
		formDriver.add(new Label("user.name"));
		formDriver.add(new Label("lastName"));		
		formCreateRoute.add(formDriver);
		
		
		// выбираются все машины
		final  List<Car> allFreeCar = carService.getAllCarsInConditionByWork(false);
		// все машины подходящие по условию заказа
		final List<Car> allFreeCarByCondition = carService.getAllFreeCarsByCapacityAndVolume(userOrder.getCargoWeight(), userOrder.getCargoVolume());
		
		// форма выбора машины
		Model<Car>carModel= new Model<Car>();
		Form formCar = new Form("formCar", new CompoundPropertyModel<Car>(carModel));
		final DropDownChoice<Car> carChoice = new DropDownChoice<Car>("carChoice",carModel, allFreeCarByCondition, CarChoiseRenderer.INSTANCE){
			@Override
			protected boolean wantOnSelectionChangedNotifications() {
				return true;
			}
		};
		
		carChoice.setLabel(new ResourceModel("p.home.carPage"));
		/* при редактировании маршрута ставит в значение в комбике по кмолчанию на
		 * переданную машину, так же сбрасывает значение  getCar().setWork(false);
		 * т.к. без этого при сменеп машины, старая машина осталась бы со значением setWork(true)*/
		if (route.getCar()!=null){
			carChoice.setDefaultModelObject(route.getCar());
			route.getCar().setWork(false);
			carService.saveOrUpdate(route.getCar());
		}
		carChoice.setRequired(true);
		formCar.add(carChoice);
		
		// характеристики машины
		formCar.add(new Label("carType.brand"));
		formCar.add(new Label("carType.model"));		
		formCar.add(new Label("carType.type"));
		formCar.add(new Label("carryingCapacity"));		
		formCar.add(new Label("volumeCapacity"));
		formCar.add(new Label("bodyLength"));		
		formCar.add(new Label("bodyWidth"));
		formCreateRoute.add(formCar);			

		// кнопка для сохранения маршрута
		formCreateRoute.add(new SubmitLink("sumbit-Formlink") {
			@Override
			public void onSubmit() {
				super.onSubmit();
				route.setActive(true);
				route.setUserOrder(userOrder);		
				// сохраняем в маршрут водителя с комбика
				route.setDriver(driverChoice.getModelObject());
				// сохраняем в маршрут машину с комбика
				route.setCar(carChoice.getModelObject());			
				routeService.sendDriverToRoute(route);
				LOGGER.info(user.getId() + user.getLogin() + " send driver to route ");
				setResponsePage(HomePage.class);
			}
		});
		
		add(formCreateRoute);

	
		}
	
}

